<?php
/**
 * Description of PessoaDAO
 *
 * @author Magno
 */
class PessoaDAO {

    private $conexao;
    private $enderecoDAO;

    public function __construct() {
        $this->conexao = Conexao::getConexao();
        $this->enderecoDAO = new EnderecoDAO();
    }

    public function salvar($pessoa) {

        try {                        

            if($this->existe($pessoa->getCliente()->getUsuarioID())) {
                $statment = $this->conexao->prepare("UPDATE pessoa SET
                        nome = :nome,
                        cpf = :cpf,
                        sexo = :sexo,
                        dataNascimento = :dataNascimento,
                        estadoCivil = :estadoCivil,
                        telefone = :telefone
                        WHERE usuarioID = :usuarioID");

            }else {
                $statment = $this->conexao->prepare("INSERT INTO pessoa(usuarioID,nome,cpf,sexo,dataNascimento,estadoCivil,telefone)
                    VALUES (:usuarioID,:nome,:cpf,:sexo,:dataNascimento,:estadoCivil,:telefone);");
            }

            if($statment->execute($pessoa->toBD())) {
                
                $pessoa->getEndereco()->setPessoa($pessoa);
                $pessoa->setEndereco($this->enderecoDAO->salvar($pessoa->getEndereco()));
                
                return $pessoa;
            }else {
                $erros = $statment->errorInfo();
                throw new Exception("Erro PessoaDAO: ".$erros[2]);
            }

        }catch(PDOExestadoCiviltion $err) {
            throw new ExestadoCiviltion("Erro PessoaDAO:".$err->getMessage());
        }

    }

    public function excluir($usuarioID) {

        try {

            $statment = $this->conexao->prepare("DELETE FROM pessoa WHERE usuarioID = :usuarioID");
            $statment->bindParam(':usuarioID',$usuarioID);

            if(!$statment->execute()) {
                $erros = $statment->errorInfo();
                throw new ExestadoCiviltion("Erro PessoaDAO: ".$erros[2]);
            }

        }catch(PDOExestadoCiviltion $err) {
            throw new ExestadoCiviltion("Erro PessoaDAO:".$err->getMessage());
        }

    }

    public function listar($pagina = 0,$nome = "", $cpf = "", $carregarDependencias = false) {
        try {

            $cidadeDAO = new CidadeDAO();

            $limite = Util::getPaginacao($pagina);
            $where = $this->getWhere($nome,$cpf);
            $pessoas = array();
            $statment = $this->conexao->query( "SELECT * FROM pessoa c $where $limite" );

            foreach ( $statment->fetchAll(PDO::FETCH_SERIALIZE) as $row ) {
                $pessoa = new PessoaBean(null, $row['nome'], $row['cpf'], $row['sexo'], Util::dateToString($row['dataNascimento']), $row['estadoCivil'], $row['telefone']);

                if($carregarDependencias){
                    $pessoa->setEndereco($this->enderecoDAO->buscarPorID($row['usuarioID'],$carregarDependencias));
                }

                $pessoas[] = $pessoa;
            }

            return $pessoas;

        }catch(PDOExestadoCiviltion $err) {
            throw new ExestadoCiviltion("Erro PessoaDAO:".$err->getMessage());
        }
    }

    public function buscarPorID($usuarioID, $carregarDependencias = false) {
        try {
            $cidadeDAO = new CidadeDAO();
            $row = $this->conexao->query("SELECT * FROM pessoa WHERE usuarioID = $usuarioID ")->fetch(PDO::FETCH_SERIALIZE);

            if(isset($row['usuarioID']) && $row['usuarioID'] > 0) {
                $pessoa = new PessoaBean(null, $row['nome'], $row['cpf'], $row['sexo'], Util::dateToString($row['dataNascimento']), $row['estadoCivil'], $row['telefone']);

                if($carregarDependencias){
                    $pessoa->setEndereco($this->enderecoDAO->buscarPorID($row['usuarioID'],$carregarDependencias));
                }
                return $pessoa;
            }else {
                return null;
            }


        }catch(PDOExestadoCiviltion $err) {
            throw new ExestadoCiviltion("Erro PessoaDAO:".$err->getMessage());
        }
    }

    public function existe($usuarioID){
        if($this->buscarPorID($usuarioID) != null)
            return true;
        return false;
    }

    private function getWhere($nome = "",$cpf = "") {
        $where = " WHERE 1 = 1 ";

        if (isset ($nome) && strlen($nome) > 0) {
            $where = $where." AND c.nome like '%$nome%' ";
        }

        if (isset ($cpf) && $cpf > 0) {
            $where = $where." AND c.cpf = '$cpf' ";
        }

        return $where;
    }

    public function total($nome = "",$cpf = "") {
        try {

            $where = $this->getWhere($nome,$cpf);
            $total = $this->conexao->query( "SELECT COUNT(c.usuarioID) total FROM pessoa c $where" )->fetch(PDO::FETCH_COLUMN);
            return $total;

        }catch(PDOExestadoCiviltion $err) {
            throw new ExestadoCiviltion("Erro PessoaDAO:".$err->getMessage());
        }
    }

}
?>
